// app.js
const rongcloud = require('./utils/rongcloud.js');
const storage = require('./utils/storage.js');
const notification = require('./utils/notification.js');

App({
  onLaunch: function (options) {
    console.log('🚀 =============== 小程序启动 ===============');
    console.log('📊 启动参数:', options);
    
    this.globalData = {
      // env 参数说明：
      //   env 参数决定接下来小程序发起的云开发调用（wx.cloud.xxx）会默认请求到哪个云环境的资源
      //   此处请填入环境 ID, 环境 ID 可打开云控制台查看
      //   如不填则使用默认环境（第一个创建的环境）
      env: "",
      // 融云IM连接状态
      rongcloudConnected: false,
      rongcloudConnecting: false,  // 🔥 新增：标记是否正在连接中
      rongcloudUserId: null,       // 🔥 融云用户ID
      // 通知管理器
      notificationManager: notification.notificationManager
    };
    
    // 初始化微信云开发
    if (!wx.cloud) {
      console.error("请使用 2.2.3 或以上的基础库以使用云能力");
    } else {
      wx.cloud.init({
        env: this.globalData.env,
        traceUser: true,
      });
    }
    
    // 🔥 初始化融云IM SDK
    console.log('🚀 开始初始化融云IM...');
    console.log('📦 rongcloud 模块:', rongcloud);
    console.log('📦 rongcloud.init 类型:', typeof rongcloud.init);
    
    if (typeof rongcloud.init !== 'function') {
      console.error('❌ rongcloud.init 不是一个函数！');
      console.error('📦 可用的方法:', Object.keys(rongcloud));
      return;
    }
    
    const initSuccess = rongcloud.init();
    
    if (initSuccess) {
      console.log('✅ 融云IM SDK初始化成功');
      
      // 🔔 设置融云消息监听器
      this.setupRongCloudMessageListener();
      
      // 如果用户已登录，自动连接融云IM
      this.autoConnectRongCloud();
    } else {
      console.error('❌ 融云IM SDK初始化失败');
      console.error('');
      console.error('📖 查看解决方案文档：⚠️立即下载融云SDK.md');
      console.error('');
    }
    
    // 🔥 检查登录状态（延迟执行，等待页面加载完成）
    setTimeout(() => {
      this.checkLoginStatus();
    }, 300);
  },
  
  // 🔥 自动连接融云IM（如果用户已登录）
  autoConnectRongCloud() {
    const userInfo = storage.getUserInfo();
    
    if (!userInfo || !userInfo.userid) {
      console.log('⚠️ 用户未登录，跳过融云IM自动连接');
      return;
    }
    
    console.log('🔄 用户已登录，尝试自动连接融云IM...');
    console.log('👤 用户ID:', userInfo.userid);
    console.log('👤 用户名称:', userInfo.username);
    
    // 🔥 从本地存储获取Token（支持多种读取方式）
    let token = wx.getStorageSync('rongcloud_token');
    
    // 🔥 备用方案：如果独立的token键不存在，从用户信息的extraData中读取
    if (!token && userInfo.extraData && userInfo.extraData.token) {
      token = userInfo.extraData.token;
      console.log('📝 从用户信息extraData中读取Token');
      // 🔥 同时保存到独立的键中，方便下次读取
      wx.setStorageSync('rongcloud_token', token);
      console.log('✅ Token已同步保存到独立存储键');
    }
    
    if (token) {
      console.log('🔑 找到融云Token，开始连接');
      console.log('🔑 Token长度:', token.length);
      console.log('🔑 Token前缀:', token.substring(0, 20) + '...');
      this.connectRongCloud(token);
    } else {
      console.error('❌ 本地无融云Token，请重新登录');
      console.error('💡 提示：融云Token应该在登录时由后端返回并保存');
    }
  },
  
  // 🔥 连接融云IM
  connectRongCloud(token) {
    // 🔥 检查是否正在连接中
    if (this.globalData.rongcloudConnecting) {
      console.log('⚠️ 融云IM正在连接中，跳过重复连接');
      return;
    }
    
    // 🔥 检查是否已连接
    if (this.globalData.rongcloudConnected) {
      console.log('✅ 融云IM已连接，无需重复连接');
      return;
    }
    
    // 🔥 设置连接中状态
    this.globalData.rongcloudConnecting = true;
    console.log('🔄 开始连接融云IM...');
    
    rongcloud.connect(token)
      .then((result) => {
        console.log('✅ 融云IM连接成功');
        
        // SDK 5.x 版本的响应结构
        let userId = result?.userId || result?.data?.userId || result?.id;
        console.log('👤 融云用户ID:', userId);
        
        this.globalData.rongcloudConnected = true;
        this.globalData.rongcloudConnecting = false;  // 🔥 连接完成
        if (userId) {
          this.globalData.rongcloudUserId = userId;
        }
        
        // 🔥 建立当前用户的手机号映射关系
        const userInfo = storage.getUserInfo();
        const userPhone = userInfo?.userPhone || storage.getUserPhone();
        const dbUserId = userInfo?.userid;
        
        if (userPhone && dbUserId) {
          notification.updatePhoneToIdMapping(userPhone, dbUserId);
          console.log('✅ 已建立当前用户映射: 手机号', userPhone, '→ 数据库ID', dbUserId);
        }
        
        // 显示连接成功提示（可选）
        // wx.showToast({
        //   title: 'IM已连接',
        //   icon: 'success',
        //   duration: 1500
        // });
      })
      .catch((error) => {
        console.error('❌ 融云IM连接失败:', error);
        console.error('错误码:', error.code);
        console.error('错误信息:', error.msg || error.message);
        this.globalData.rongcloudConnected = false;
        this.globalData.rongcloudConnecting = false;  // 🔥 连接失败
        
        // 如果Token无效，清除本地Token并提示用户重新登录
        if (error.code === 31004) {
          console.log('🔑 Token无效，清除本地Token');
          wx.removeStorageSync('rongcloud_token');
          
          wx.showModal({
            title: '连接失败',
            content: '融云Token已失效，请重新登录',
            showCancel: false,
            success: () => {
              // 跳转到登录页面
              wx.reLaunch({
                url: '/pages/login/index'
              });
            }
          });
        }
      });
  },
  
  // 🔥 断开融云IM连接（退出登录时调用）
  disconnectRongCloud() {
    console.log('🔄 开始断开融云IM连接...');
    
    rongcloud.disconnect()
      .then(() => {
        console.log('✅ 融云IM已断开');
        this.globalData.rongcloudConnected = false;
      })
      .catch((error) => {
        console.error('❌ 融云IM断开失败:', error);
      });
  },
  
  // 🔔 设置融云消息监听器
  setupRongCloudMessageListener() {
    console.log('🔔 设置融云消息监听器...');
    const unreadUtil = require('./utils/unread.js');
    
    // 添加消息监听器
    rongcloud.addMessageListener((message) => {
      console.log('🔔 =============== 收到融云消息 ===============');
      console.log('📨 消息详情:', message);
      
      // 🔥 使用统一的消息处理方法（职责分离）
      try {
        const messageStorage = require('./utils/messageStorage.js');
        const processedMessage = messageStorage.processAndSaveRongCloudMessage(message);
        
        if (processedMessage) {
          console.log('✅ 消息已处理并保存:', processedMessage);
        }
      } catch (error) {
        console.error('❌ 消息处理失败:', error);
      }
      
      // 🔔 增加未读消息计数（只在非聊天页面时增加）
      try {
        const pages = getCurrentPages();
        const currentPage = pages[pages.length - 1];
        const currentRoute = currentPage ? currentPage.route : '';
        const senderPhone = message.senderUserId;
        
        // 如果当前不在该好友的聊天页面，增加未读数
        if (currentRoute !== 'pages/chat/index' || 
            (currentPage.data && currentPage.data.friendPhone !== senderPhone)) {
          unreadUtil.addUnread(senderPhone, 1);
          console.log('📬 增加未读消息:', senderPhone);
        } else {
          console.log('💬 当前在聊天页面，不增加未读数');
        }
      } catch (error) {
        console.error('❌ 处理未读消息失败:', error);
      }
      
      // 解析消息并显示通知
      const notificationManager = this.globalData.notificationManager;
      if (notificationManager) {
        notificationManager.parseAndShow(message);
      } else {
        console.warn('⚠️ 通知管理器未初始化');
      }
    });
    
    console.log('✅ 融云消息监听器设置完成');
  },
  
  onShow: function (options) {
    console.log('👀 =============== 小程序显示 ===============');
    console.log('📊 启动参数:', options);
    
    // 🔥 检查登录状态
    this.checkLoginStatus();
    
    // 🔥 检查融云IM连接状态（从后台返回时可能需要重连）
    this.checkRongCloudConnection();
    
    // 🔔 自动初始化当前页面的通知组件
    this.autoInitNotification();
  },
  
  /**
   * 🔥 检查融云IM连接状态（小程序从后台返回时调用）
   */
  checkRongCloudConnection() {
    try {
      const isLoggedIn = storage.isLoggedIn();
      const userInfo = storage.getUserInfo();
      
      // 🔥 只有登录用户才需要检查融云连接
      if (!isLoggedIn || !userInfo || !userInfo.userid) {
        console.log('⚠️ 用户未登录，跳过融云连接检查');
        return;
      }
      
      console.log('🔍 检查融云IM连接状态:');
      console.log('   已连接:', this.globalData.rongcloudConnected);
      console.log('   连接中:', this.globalData.rongcloudConnecting);
      
      // 🔥 如果未连接且不在连接中，尝试重连
      if (!this.globalData.rongcloudConnected && !this.globalData.rongcloudConnecting) {
        console.log('⚠️ 融云IM未连接，尝试重新连接...');
        this.autoConnectRongCloud();
      } else if (this.globalData.rongcloudConnected) {
        console.log('✅ 融云IM已连接');
      } else if (this.globalData.rongcloudConnecting) {
        console.log('🔄 融云IM正在连接中...');
      }
    } catch (error) {
      console.error('💥 检查融云连接状态失败:', error);
    }
  },
  
  /**
   * 🔥 检查登录状态（小程序从后台返回时调用）
   */
  checkLoginStatus() {
    try {
      // 获取登录状态
      const isLoggedIn = storage.isLoggedIn();
      const userInfo = storage.getUserInfo();
      
      console.log('🔐 检查登录状态:');
      console.log('   是否已登录:', isLoggedIn);
      console.log('   用户信息:', userInfo ? '存在' : '不存在');
      
      // 获取当前页面路径
      const pages = getCurrentPages();
      if (pages.length === 0) {
        console.log('⚠️ 没有当前页面，跳过登录检查');
        return;
      }
      
      const currentPage = pages[pages.length - 1];
      const currentRoute = currentPage.route;
      console.log('📄 当前页面:', currentRoute);
      
      // 🔥 如果已登录
      if (isLoggedIn && userInfo && userInfo.userid) {
        console.log('✅ 用户已登录');
        console.log('👤 用户ID:', userInfo.userid);
        console.log('👤 用户名:', userInfo.username);
        
        // 🔥 如果当前在登录/注册页，跳转到首页
        const authPages = [
          'pages/login/index',      // 登录页
          'pages/register/index'    // 注册页
        ];
        
        if (authPages.includes(currentRoute)) {
          console.log('⚠️ 已登录但在登录/注册页，跳转到首页');
          wx.reLaunch({
            url: '/pages/main/index',
            success: () => {
              console.log('✅ 已跳转到首页');
            },
            fail: (error) => {
              console.error('❌ 跳转首页失败:', error);
            }
          });
          return;
        }
        
        console.log('✅ 保持当前页面:', currentRoute);
        return;
      }
      
      // 🔥 如果未登录，检查是否需要跳转到登录页
      console.log('⚠️ 用户未登录');
      
      // 🔥 白名单页面：这些页面不需要登录就可以访问
      const whiteList = [
        'pages/login/index',      // 登录页
        'pages/register/index',   // 注册页
        'pages/agreement/index',  // 协议页
        'pages/main/index'        // 首页（允许游客浏览）
      ];
      
      // 如果当前页面在白名单中，不跳转
      if (whiteList.includes(currentRoute)) {
        console.log('✅ 当前页面在白名单中，不跳转:', currentRoute);
        return;
      }
      
      // 🔥 未登录且不在白名单页面，跳转到登录页
      console.log('❌ 需要登录，跳转到登录页');
      
      wx.reLaunch({
        url: '/pages/login/index',
        success: () => {
          console.log('✅ 已跳转到登录页');
        },
        fail: (error) => {
          console.error('❌ 跳转登录页失败:', error);
        }
      });
      
    } catch (error) {
      console.error('💥 检查登录状态失败:', error);
    }
  },
  
  /**
   * 🔔 自动初始化通知组件（全局方法，无需在每个页面手动调用）
   */
  autoInitNotification() {
    try {
      // 获取当前页面
      const pages = getCurrentPages();
      if (pages.length === 0) {
        return;
      }
      
      const currentPage = pages[pages.length - 1];
      
      // 尝试获取通知组件
      const notificationComponent = currentPage.selectComponent('#toast-notification');
      
      if (notificationComponent && this.globalData.notificationManager) {
        // 设置通知管理器的组件实例
        this.globalData.notificationManager.setComponent(notificationComponent);
        console.log('✅ 通知组件自动初始化成功:', currentPage.route);
      }
    } catch (error) {
      // 静默失败，不影响正常流程
      console.log('⚠️ 通知组件自动初始化跳过（页面未使用通知组件）');
    }
  },
  
  onHide: function () {
    console.log('👋 小程序隐藏');
  }
});
